<?php
include_once BXD_INCLUDEPATH . 'lib/gettext/T.php';

/**
 * Classe per la gestione dei messaggi di errore.
 * I messaggi vengono generati in automatico dalla classe Validator oppure
 * possono essere creati manualmente
 *
 * @author Damiano Ciarla
 * @version 1.0
 * @category Lib
 */
final class ErrorManager
{
    private $errorList	= array();		//--> Lista messagi di errore
    
	private $referer	= array();		//--> Categorie dei messaggi di errore
    
	private static $istance = null;		//--> Istanza della Classe

	/**
	 * Inizializza l'array delle categorie per i messaggi impostando come
	 * valore di default NULL. Questo valore puo' essere cambiato nel corso
	 * della creazione dei messaggi di errore usando il metodo 'setReferer'
	 */
	
	private function __construct()
	{
		$this->referer[] = null;
	}
	
	/**
	 * Restituisce l'istanza della classe Error qualora questa fosse già
	 * stata istanziata altrimenti ne viene creata una nuova e viene restituita.
	 *
	 * @return ErrorManager $istance Istanza della classe ErrorManager
	 */
	
	static function getInstance()
	{
        if (self::$istance == null)
            self::$istance = new ErrorManager();
		
        return self::$istance;
    }
    
    /**
     * Ritorna l'array dei valori presenti in 'referer'. Questa lista contiene le catogorie
     * dei messaggi di errore generati dal sistema
     * 
     * @return array Lista delle categorie dei messaggi di errrore
     */
    
	public function getReferer()
	{
		return $this->referer;
	}
	
	/**
	 * Imposta la categoria dei messaggi di errore generati negli step successivi
	 * 
	 * @param $referer string Nome della categoria dei messaggi di errore
	 */
	
	public function setReferer($referer)
	{
		if(!is_bool($referer)) $this->referer[] = $referer;
	}
	
	/**
	 * Metodo che ritorna la lista dei messaggi di errore
	 * 
	 * @return array Lista dei messaggi di errore
	 */

	public function getErrorList()
	{
		return $this->errorList;
	}

	/**
	 * Il seguente metodo aggiunge un nuovo messaggio di errore alla lista degli errori
	 *
	 * @param string $error Nuovo messaggio di errore
	 */

	public function addError($error)
	{
		$this->errorList[] = new Error(end($this->referer), $error);
	}

	/**
	 * Il seguente metodo rimuove tutti i messaggi di errore presenti nella lista
	 *
	 */

	public function deleteAllError()
	{
		$this->errorList = array();
	}

	/**
	 * Stampa a video gli errori contenuti nell'array $errorList.
	 * Se specificato il 'referer' vengono stampati solamente gli errori
	 * che fanno riferimento a quella categoria
	 * 
	 * @param string $referer Riferimento alla categoria degli errori
	 */

	public function showErrorList($referer = null)
	{
		if (is_null($referer) || in_array($referer, $this->referer))
		{
			if($this->countErrorList($referer) > 0)
			{
				echo "<div class='ui-widget'>";
				echo "<div style='padding: 0pt 0.7em;' class='ui-state-error ui-corner-all'>";
	
				foreach ($this->errorList as $error)
				{
					if (!is_null($referer) && $error->getReferer() == $referer)
					{
						echo "<p style='margin:5px 0px'><span style='float: left; margin-right: 0.3em;' class='ui-icon ui-icon-alert'></span>" . $error->getError() . "</p>";
					}
					elseif (is_null($referer))
					{
						echo "<p style='margin:5px 0px'><span style='float: left; margin-right: 0.3em;' class='ui-icon ui-icon-alert'></span>" . $error->getError() . "</p>";
					}
				}
	
				echo "</div>";
				echo "</div>";
			}
		}
	}

	/**
	 * Metodo che restituisce il codice HTML per la stampa degli errori nell'array 'errorList'
	 *
	 * @param string $referer Riferimento alla categoria degli errori
	 * @return string Codice HTML con gli errori memorizzati in 'errorList'
	 */

	public function getErrorListHTML($referer = null)
	{
		$html = "";
		
		if (is_null($referer) || in_array($referer, $this->referer))
		{
			if($this->countErrorList($referer) > 0)
			{
				$html .= "<div class='ui-widget'>";
				$html .= "<div style='padding: 0pt 0.7em;' class='ui-state-error ui-corner-all'>";

				foreach ($this->errorList as $error)
				{
					if (!is_null($referer) && $error->getReferer() == $referer)
					{
						$html .= "<p style='margin:5px 0px'><span style='float: left; margin-right: 0.3em;' class='ui-icon ui-icon-alert'></span>" . $error->getError() . "</p>";
					}
					elseif (is_null($referer))
					{
						$html .= "<p style='margin:5px 0px'><span style='float: left; margin-right: 0.3em;' class='ui-icon ui-icon-alert'></span>" . $error->getError() . "</p>";
					}
				}

				$html .= "</div>";
				$html .= "</div>";
			}
		}

		return $html;
	}
	
	/**
	 * Questo metodo restituisce il numero delgi errori memorizzati nell'array 'errorList'
	 * Se viene specificato il 'referer' vengono cercati esclusivamente gli errori per il
	 * suddetto valore
	 * 
	 * @param $referer 	Riferimento alla categoria degli errori
	 * @return int		Numero di errore trovati per la categoria specificata
	 */
	
	public function countErrorList($referer = null)
	{
		$count = 0;
		
		if (is_null($referer) || in_array($referer, $this->referer))
		{
			if(count($this->errorList) > 0)
			{
				foreach ($this->errorList as $error)
				{
					if (!is_null($referer) && $error->getReferer() == $referer)
					{
						$count++;
					}
					elseif (is_null($referer))
					{
						$count++;
					}
				}
			}
		}
		
		return $count;
	}
}

/**
 * Entity per la gestione degli errori
 *
 * @author Damiano Ciarla
 */
final class Error
{
	private $referer	= null;
	private $error		= null;

	public function __construct($referer, $error)
	{
		$this->referer 	= $referer;
		$this->error 	= $error;
	}

	public function getReferer()
	{
		return $this->referer;
	}

	public function setReferer($referer)
	{
		$this->referer = $referer;
	}

	public function getError()
	{
		return $this->error;
	}

	public function setError($error)
	{
		$this->error = $error;
	}
}
?>
